import axios from 'axios'
import store from '../store'
import { __joinObj } from './common'
import { Message } from 'element-ui'
import Cookies from 'js-cookie'

const { VUE_APP_APPKEY, VUE_APP_BASE_URL } = process.env

const service = axios.create({
  timeout: 60000,
  baseURL: VUE_APP_BASE_URL
})
service.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'

//错误提示
const messageErrorTip  = (message) => {
  Message.error({
    title: '提示',
    message,
    duration: 3000
  })
}

// 退出登陆
const logout = () => {
  store.dispatch('permission/resetPermission')
  store.dispatch('user/clearInfo')
}

/**
 * 
 * @param {function} res  响应成功时的回调
 */
const responseSuccess = (res) => {
  switch (res.data.code) {
    case 10011:
      messageErrorTip('非法请求，缺少系统级参数')
      break
    case 10012:
      messageErrorTip('非法请求，未知的调用方')
      break
    case 10013:
      messageErrorTip('请求过期，请求过期')
      break
    case 10014:
      messageErrorTip('非法请求，签名sign验证失败')
      break
    case 10021:
      messageErrorTip('您还没有登录呢，请您先登录!')
      logout()
      break
    case 10022:
      messageErrorTip('登录过期，请重新登录!')
      logout()
      break
    case 10023:
      messageErrorTip('您的账号在其他设备登录，请重新登录!')
      logout()
      break
    case 500:         //内部错误
      messageErrorTip('抱歉，当前值班小哥哥翘班了，我们马上报告老板！')
      break 
    default :      //业务错误
      if(res.data.code >= 10000){
        messageErrorTip(res.data.message)
      }
  }
  return Promise.resolve(res.data)
}

/**
 * 
 * @param {function} err 响应失败时的回调
 */
const responseFail = (err) => {
  // 断网 或者 请求超时 状态
  if (!err.response) {
    // 请求超时状态
    if (err.message.includes('timeout')) {
      messageErrorTip('请求超时，请检查网络是否连接正常')
    } else {
      messageErrorTip('请求失败，请检查网络是否已连接')
    }
    return
  }
  // 判断服务器返回不是 2 开头的情况
  const responseCode = err.response.status
  switch (responseCode) {
    case 401:
      messageErrorTip('请重新登录')
      logout()
      break
    case 403:
      messageErrorTip('接口无权限方法')
      break
    case 404:
      messageErrorTip('接口不存在')
      break
    default:
      messageErrorTip(err.response.data.message)
  }
  return Promise.reject(err)
}


/**
 * 请求拦截
 */
service.interceptors.request.use(config => {
  let data = config.data || config.params || {}
  // 过滤掉value值不存在的属性
  let filterData = Object.entries(data).filter(item => item[1] !== null && item[1] !== undefined)
  // 将数组和对象转换为字符串
  filterData = filterData.map(item => {
    if (Object.prototype.toString.call(item[1]) === '[object Object]' || Object.prototype.toString.call(item[1]) === '[object Array]') {
      return [item[0], JSON.stringify(item[1])]
    }
    return item
  })
  data = Object.fromEntries(filterData)
  if(Object.keys(data).length){
    config.data = data
  }else{
    config.data = ''
  }
  

  const HEADERS = config.headers || {}
  const TIMESTAMP = Date.now()
  const SIGNPARAMS = {
    'c-timestamp': TIMESTAMP,
    'c-app-key': VUE_APP_APPKEY,
    'c-sign': __joinObj(Object.assign({}, data, { 'c-app-key': VUE_APP_APPKEY, 'c-timestamp': TIMESTAMP }))
  }
  config.headers = Object.assign(HEADERS, SIGNPARAMS)

  config.headers['c-token'] = Cookies.get('token') || ''

  return config
}, error => {
  return Promise.reject(error)
})

/**
 * 响应拦截
 */
service.interceptors.response.use(
  responseSuccess,
  responseFail
)


export default service
